{
  "bundles": [
    {
      "@type": "NXBundle",
      "artifactId": "nuxeo-usermapper",
      "artifactVersion": "7.10",
      "bundleGroup": {
        "@type": "NXBundleGroup",
        "bundleIds": [
          "org.nuxeo.admin.center",
          "org.nuxeo.admin.center.analytics.dashboards",
          "org.nuxeo.admin.center.monitoring",
          "org.nuxeo.admin.center.oauth.opensocial",
          "org.nuxeo.apidoc.core",
          "org.nuxeo.apidoc.webengine",
          "org.nuxeo.connect.client.wrapper",
          "org.nuxeo.connect.update",
          "org.nuxeo.ecm.actions",
          "org.nuxeo.ecm.actions.jsf",
          "org.nuxeo.ecm.audit.io",
          "org.nuxeo.ecm.default.config",
          "org.nuxeo.ecm.imaging.recompute",
          "org.nuxeo.ecm.permissions",
          "org.nuxeo.ecm.platform",
          "org.nuxeo.ecm.platform.api",
          "org.nuxeo.ecm.platform.audio.core",
          "org.nuxeo.ecm.platform.audio.jsf",
          "org.nuxeo.ecm.platform.collections.core",
          "org.nuxeo.ecm.platform.collections.jsf",
          "org.nuxeo.ecm.platform.commandline.executor",
          "org.nuxeo.ecm.platform.content.template",
          "org.nuxeo.ecm.platform.contentview.jsf",
          "org.nuxeo.ecm.platform.convert",
          "org.nuxeo.ecm.platform.dublincore",
          "org.nuxeo.ecm.platform.el",
          "org.nuxeo.ecm.platform.htmlsanitizer",
          "org.nuxeo.ecm.platform.importer.core",
          "org.nuxeo.ecm.platform.importer.jaxrs",
          "org.nuxeo.ecm.platform.lang",
          "org.nuxeo.ecm.platform.login",
          "org.nuxeo.ecm.platform.login.cas2",
          "org.nuxeo.ecm.platform.login.default",
          "org.nuxeo.ecm.platform.login.digest",
          "org.nuxeo.ecm.platform.login.shibboleth",
          "org.nuxeo.ecm.platform.login.token",
          "org.nuxeo.ecm.platform.mail",
          "org.nuxeo.ecm.platform.mail.types",
          "org.nuxeo.ecm.platform.mail.web",
          "org.nuxeo.ecm.platform.oauth",
          "org.nuxeo.ecm.platform.preview",
          "org.nuxeo.ecm.platform.rendering",
          "org.nuxeo.ecm.platform.restapi.io",
          "org.nuxeo.ecm.platform.restapi.server",
          "org.nuxeo.ecm.platform.spreadsheet",
          "org.nuxeo.ecm.platform.suggestbox.core",
          "org.nuxeo.ecm.platform.suggestbox.jsf",
          "org.nuxeo.ecm.platform.thumbnail",
          "org.nuxeo.ecm.platform.ui",
          "org.nuxeo.ecm.platform.ui.select2",
          "org.nuxeo.ecm.platform.uidgen.core",
          "org.nuxeo.ecm.platform.web.common",
          "org.nuxeo.ecm.platform.webapp.types",
          "org.nuxeo.ecm.platform.ws",
          "org.nuxeo.ecm.platform.ws.sun.jaxws",
          "org.nuxeo.ecm.user.center",
          "org.nuxeo.ecm.user.center.dashboard",
          "org.nuxeo.ecm.user.center.dashboard.jsf",
          "org.nuxeo.ecm.user.center.notification",
          "org.nuxeo.ecm.user.center.oauth",
          "org.nuxeo.ecm.user.center.profile",
          "org.nuxeo.ecm.user.invite",
          "org.nuxeo.ecm.user.registration",
          "org.nuxeo.ecm.user.registration.web",
          "org.nuxeo.ecm.webapp.base",
          "org.nuxeo.ecm.webapp.core",
          "org.nuxeo.ecm.webapp.ui",
          "org.nuxeo.ecm.webdav",
          "org.nuxeo.platform.virtualnavigation.types",
          "org.nuxeo.platform.virtualnavigation.web",
          "org.nuxeo.search.ui",
          "org.nuxeo.usermapper"
        ],
        "hierarchyPath": "/grp:org.nuxeo.ecm.platform",
        "id": "grp:org.nuxeo.ecm.platform",
        "name": "org.nuxeo.ecm.platform",
        "parentIds": [],
        "readmes": [],
        "version": "7.10"
      },
      "bundleId": "org.nuxeo.usermapper",
      "components": [
        {
          "@type": "NXComponent",
          "componentClass": "org.nuxeo.usermapper.service.UserMapperComponent",
          "documentation": "\n    This component expose a service to help mapping NuxeoPrincipal to\n    userObject provided by an external system.\n\n    The mapping itself is configurable using an extension point.\n\n    Typical use cases include :\n\n    <ul>\n    <li> SSO plugin that are able to do Just In Time provisioning </li>\n    <ul>\n        <li> SAML </li>\n        <li> Shibboleth </li>\n        <li> OpenId </li>\n        <li> Keyloack </li>\n    </ul>\n    <li> User provisioning API (such as SCIM) </li>\n</ul>\n",
          "documentationHtml": "<p>\nThis component expose a service to help mapping NuxeoPrincipal to\nuserObject provided by an external system.\n</p><p>\nThe mapping itself is configurable using an extension point.\n</p><p>\nTypical use cases include :\n</p><p>\n</p><ul><li> SSO plugin that are able to do Just In Time provisioning </li><li><ul><li> SAML </li><li> Shibboleth </li><li> OpenId </li><li> Keyloack </li></ul>\n</li><li> User provisioning API (such as SCIM) </li></ul>",
          "extensionPoints": [
            {
              "@type": "NXExtensionPoint",
              "componentId": "org.nuxeo.usermapper.service.UserMapperComponent",
              "descriptors": [
                "org.nuxeo.usermapper.service.UserMapperDescriptor"
              ],
              "documentation": "\n      Allow to contribute mapper classes that will be responsible for\n      handling the mapping in 2 directions :\n\n      <ul>\n    <li> find and update NuxeoPrincipal given a userObject coming from\n          the external system</li>\n    <li> create an external userObject from a NuxeoPrincipal</li>\n</ul>\n\n\n      Here is an example to contribute a custom class :\n      <code>\n    <mapper class=\"org.nuxeo.usermapper.test.dummy.DummyUserMapper\" name=\"javaDummy\">\n        <parameters>\n            <param name=\"param1\">value1</param>\n        </parameters>\n    </mapper>\n</code>\n\n\n      The contributed class has to implement the UserMapper interface.\n\n      You can also contribute the implementation via a Groovy or JavaScript.\n\n      In this case, simply omit the class attribute and add a script tag:\n\n      <code>\n    <mapper name=\"scim\" type=\"groovy\">\n        <mapperScript><![CDATA[\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n              UserManager um = Framework.getLocalService(UserManager.class);\n\n              String userId = userObject.getId();\n              if (userId == null || userId.isEmpty()) {\n                userId = userObject.getUserName();\n              }\n\n              searchAttributes.put(um.getUserIdField(), userId);\n\n              if (searchAttributes.containsKey(\"uid\")) {\n                userAttributes.put(um.getUserIdField(), searchAttributes.get(\"uid\"));\n              }\n\n              if (userObject.getEmails() != null && userObject.getEmails().size() > 0) {\n                userAttributes.put(\"email\",userObject.getEmails().iterator().next().getValue());\n              }\n              String displayName = userObject.getDisplayName();\n              if (displayName!=null && !displayName.isEmpty()) {\n                int idx = displayName.indexOf(\" \");\n                if (idx>0) {\n                    userAttributes.put(\"firstName\", displayName.substring(0, idx).trim());\n                    userAttributes.put(\"lastName\", displayName.substring(idx+1).trim());\n                } else {\n                    userAttributes.put(\"firstName\", displayName);\n                    userAttributes.put(\"lastName\", \"\");\n                }\n            }\n            ]]></mapperScript>\n        <wrapperScript><![CDATA[\n          import org.nuxeo.ecm.core.api.DocumentModel;\n          import org.nuxeo.ecm.core.api.NuxeoException;\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n          import com.unboundid.scim.data.Entry;\n          import com.unboundid.scim.data.GroupResource;\n          import com.unboundid.scim.data.Meta;\n          import com.unboundid.scim.data.Name;\n          import com.unboundid.scim.data.UserResource;\n          import com.unboundid.scim.schema.CoreSchema;\n          import com.unboundid.scim.sdk.SCIMConstants;\n\n              UserManager um = Framework.getLocalService(UserManager.class);\n              DocumentModel userModel = nuxeoPrincipal.getModel();\n              String userId = (String) userModel.getProperty(um.getUserSchemaName(),\n                      um.getUserIdField());\n\n              String fname = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"firstName\");\n              String lname = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"lastName\");\n              String email = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"email\");\n              String company = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"company\");\n\n              String displayName = fname + \" \" + lname;\n              displayName = displayName.trim();\n              userObject.setDisplayName(displayName);\n              Collection<Entry<String>> emails = new ArrayList<>();\n              if (email!=null) {\n                  emails.add(new Entry<String>(email, \"string\"));\n                  userObject.setEmails(emails);\n              }\n\n              Name fullName = new Name(displayName, lname, \"\", fname, \"\", \"\");\n              userObject.setSingularAttributeValue(SCIMConstants.SCHEMA_URI_CORE,\n                      \"name\", Name.NAME_RESOLVER, fullName);\n\n              // manage groups\n              List<String> groupIds = um.getPrincipal(userId).getAllGroups();\n              Collection<Entry<String>> groups = new ArrayList<>();\n              for (String groupId : groupIds) {\n                  groups.add(new Entry<String>(groupId, \"string\"));\n              }\n              userObject.setGroups(groups);\n\n              userObject.setActive(true);\n            ]]></wrapperScript>\n    </mapper>\n    <mapper name=\"jsDummy\" type=\"js\">\n        <mapperScript>\n              searchAttributes.put(\"username\", userObject.login);\n              userAttributes.put(\"firstName\", userObject.name.firstName);\n              userAttributes.put(\"lastName\", userObject.name.lastName);\n              profileAttributes.put(\"userprofile:phonenumber\", \"555.666.7777\");\n          </mapperScript>\n    </mapper>\n</code>\n\n\n      In the script context for mapping userObject to NuxeoPrincipal :\n      <ul>\n    <li>\n          userObject : represent the object passed to the\n          <pre>getCreateOrUpdateNuxeoPrincipal</pre>\n          method\n        </li>\n    <li> searchAttributes : is the Map&lt;String,String&gt; that will be used\n          to search the NuxeoPrincipal</li>\n    <li> userAttributes : is the Map&lt;String,String&gt; that will be used\n          to create/update the NuxeoPrincipal</li>\n    <li> profileAttribute : is the Map&lt;String,String&gt; that will be used\n          to update the user's profile</li>\n</ul>\n\n\n\n      In the script context for wrapping a NuxeoPrincipal into a userObject :\n      <ul>\n    <li>\n          userObject : represent the userObject as initialized by the caller code\n        </li>\n    <li> nuxeoPrincipal : is the principal to wrap</li>\n    <li> params : is the Map&lt;String,Serializable&gt; passed by the caller</li>\n</ul>\n",
              "documentationHtml": "<p>\nAllow to contribute mapper classes that will be responsible for\nhandling the mapping in 2 directions :\n</p><p>\n</p><ul><li> find and update NuxeoPrincipal given a userObject coming from\nthe external system</li><li> create an external userObject from a NuxeoPrincipal</li></ul>\n<p>\nHere is an example to contribute a custom class :\n</p><p></p><pre><code>    &lt;mapper class&#61;&#34;org.nuxeo.usermapper.test.dummy.DummyUserMapper&#34; name&#61;&#34;javaDummy&#34;&gt;\n        &lt;parameters&gt;\n            &lt;param name&#61;&#34;param1&#34;&gt;value1&lt;/param&gt;\n        &lt;/parameters&gt;\n    &lt;/mapper&gt;\n</code></pre><p>\nThe contributed class has to implement the UserMapper interface.\n</p><p>\nYou can also contribute the implementation via a Groovy or JavaScript.\n</p><p>\nIn this case, simply omit the class attribute and add a script tag:\n</p><p>\n</p><pre><code>    &lt;mapper name&#61;&#34;scim&#34; type&#61;&#34;groovy&#34;&gt;\n        &lt;mapperScript&gt;&lt;![CDATA[\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n              UserManager um &#61; Framework.getLocalService(UserManager.class);\n\n              String userId &#61; userObject.getId();\n              if (userId &#61;&#61; null || userId.isEmpty()) {\n                userId &#61; userObject.getUserName();\n              }\n\n              searchAttributes.put(um.getUserIdField(), userId);\n\n              if (searchAttributes.containsKey(&#34;uid&#34;)) {\n                userAttributes.put(um.getUserIdField(), searchAttributes.get(&#34;uid&#34;));\n              }\n\n              if (userObject.getEmails() !&#61; null &amp;&amp; userObject.getEmails().size() &gt; 0) {\n                userAttributes.put(&#34;email&#34;,userObject.getEmails().iterator().next().getValue());\n              }\n              String displayName &#61; userObject.getDisplayName();\n              if (displayName!&#61;null &amp;&amp; !displayName.isEmpty()) {\n                int idx &#61; displayName.indexOf(&#34; &#34;);\n                if (idx&gt;0) {\n                    userAttributes.put(&#34;firstName&#34;, displayName.substring(0, idx).trim());\n                    userAttributes.put(&#34;lastName&#34;, displayName.substring(idx&#43;1).trim());\n                } else {\n                    userAttributes.put(&#34;firstName&#34;, displayName);\n                    userAttributes.put(&#34;lastName&#34;, &#34;&#34;);\n                }\n            }\n            ]]&gt;&lt;/mapperScript&gt;\n        &lt;wrapperScript&gt;&lt;![CDATA[\n          import org.nuxeo.ecm.core.api.DocumentModel;\n          import org.nuxeo.ecm.core.api.NuxeoException;\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n          import com.unboundid.scim.data.Entry;\n          import com.unboundid.scim.data.GroupResource;\n          import com.unboundid.scim.data.Meta;\n          import com.unboundid.scim.data.Name;\n          import com.unboundid.scim.data.UserResource;\n          import com.unboundid.scim.schema.CoreSchema;\n          import com.unboundid.scim.sdk.SCIMConstants;\n\n              UserManager um &#61; Framework.getLocalService(UserManager.class);\n              DocumentModel userModel &#61; nuxeoPrincipal.getModel();\n              String userId &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      um.getUserIdField());\n\n              String fname &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      &#34;firstName&#34;);\n              String lname &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      &#34;lastName&#34;);\n              String email &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      &#34;email&#34;);\n              String company &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      &#34;company&#34;);\n\n              String displayName &#61; fname &#43; &#34; &#34; &#43; lname;\n              displayName &#61; displayName.trim();\n              userObject.setDisplayName(displayName);\n              Collection&lt;Entry&lt;String&gt;&gt; emails &#61; new ArrayList&lt;&gt;();\n              if (email!&#61;null) {\n                  emails.add(new Entry&lt;String&gt;(email, &#34;string&#34;));\n                  userObject.setEmails(emails);\n              }\n\n              Name fullName &#61; new Name(displayName, lname, &#34;&#34;, fname, &#34;&#34;, &#34;&#34;);\n              userObject.setSingularAttributeValue(SCIMConstants.SCHEMA_URI_CORE,\n                      &#34;name&#34;, Name.NAME_RESOLVER, fullName);\n\n              // manage groups\n              List&lt;String&gt; groupIds &#61; um.getPrincipal(userId).getAllGroups();\n              Collection&lt;Entry&lt;String&gt;&gt; groups &#61; new ArrayList&lt;&gt;();\n              for (String groupId : groupIds) {\n                  groups.add(new Entry&lt;String&gt;(groupId, &#34;string&#34;));\n              }\n              userObject.setGroups(groups);\n\n              userObject.setActive(true);\n            ]]&gt;&lt;/wrapperScript&gt;\n    &lt;/mapper&gt;\n    &lt;mapper name&#61;&#34;jsDummy&#34; type&#61;&#34;js&#34;&gt;\n        &lt;mapperScript&gt;\n              searchAttributes.put(&#34;username&#34;, userObject.login);\n              userAttributes.put(&#34;firstName&#34;, userObject.name.firstName);\n              userAttributes.put(&#34;lastName&#34;, userObject.name.lastName);\n              profileAttributes.put(&#34;userprofile:phonenumber&#34;, &#34;555.666.7777&#34;);\n          &lt;/mapperScript&gt;\n    &lt;/mapper&gt;\n</code></pre><p>\nIn the script context for mapping userObject to NuxeoPrincipal :\n</p><ul><li>\nuserObject : represent the object passed to the\n<pre>getCreateOrUpdateNuxeoPrincipal</pre>\nmethod\n</li><li> searchAttributes : is the Map&lt;String,String&gt; that will be used\nto search the NuxeoPrincipal</li><li> userAttributes : is the Map&lt;String,String&gt; that will be used\nto create/update the NuxeoPrincipal</li><li> profileAttribute : is the Map&lt;String,String&gt; that will be used\nto update the user&#39;s profile</li></ul>\n<p>\nIn the script context for wrapping a NuxeoPrincipal into a userObject :\n</p><ul><li>\nuserObject : represent the userObject as initialized by the caller code\n</li><li> nuxeoPrincipal : is the principal to wrap</li><li> params : is the Map&lt;String,Serializable&gt; passed by the caller</li></ul>",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/org.nuxeo.usermapper/org.nuxeo.usermapper.service.UserMapperComponent/ExtensionPoints/org.nuxeo.usermapper.service.UserMapperComponent--mapper",
              "id": "org.nuxeo.usermapper.service.UserMapperComponent--mapper",
              "label": "mapper (org.nuxeo.usermapper.service.UserMapperComponent)",
              "name": "mapper",
              "version": "7.10"
            }
          ],
          "extensions": [],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/org.nuxeo.usermapper/org.nuxeo.usermapper.service.UserMapperComponent",
          "name": "org.nuxeo.usermapper.service.UserMapperComponent",
          "requirements": [],
          "services": [
            {
              "@type": "NXService",
              "componentId": "org.nuxeo.usermapper.service.UserMapperComponent",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/org.nuxeo.usermapper/org.nuxeo.usermapper.service.UserMapperComponent/Services/org.nuxeo.usermapper.service.UserMapperService",
              "id": "org.nuxeo.usermapper.service.UserMapperService",
              "overriden": false,
              "version": "7.10"
            }
          ],
          "version": "7.10",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n\n<component name=\"org.nuxeo.usermapper.service.UserMapperComponent\"\n  version=\"1.0\">\n\n  <implementation class=\"org.nuxeo.usermapper.service.UserMapperComponent\" />\n\n  <service>\n    <provide interface=\"org.nuxeo.usermapper.service.UserMapperService\" />\n  </service>\n\n  <documentation>\n    This component expose a service to help mapping NuxeoPrincipal to\n    userObject provided by an external system.\n\n    The mapping itself is configurable using an extension point.\n\n    Typical use cases include :\n\n    <ul>\n      <li> SSO plugin that are able to do Just In Time provisioning </li>\n      <ul>\n        <li> SAML </li>\n        <li> Shibboleth </li>\n        <li> OpenId </li>\n        <li> Keyloack </li>\n      </ul>\n      <li> User provisioning API (such as SCIM) </li>\n    </ul>\n  </documentation>\n\n\n  <extension-point name=\"mapper\">\n    <documentation>\n      Allow to contribute mapper classes that will be responsible for\n      handling the mapping in 2 directions :\n\n      <ul>\n        <li> find and update NuxeoPrincipal given a userObject coming from\n          the external system</li>\n        <li> create an external userObject from a NuxeoPrincipal</li>\n      </ul>\n\n      Here is an example to contribute a custom class :\n      <code>\n\n        <mapper name=\"javaDummy\"\n          class=\"org.nuxeo.usermapper.test.dummy.DummyUserMapper\">\n          <parameters>\n            <param name=\"param1\">value1</param>\n          </parameters>\n        </mapper>\n\n      </code>\n\n      The contributed class has to implement the UserMapper interface.\n\n      You can also contribute the implementation via a Groovy or JavaScript.\n\n      In this case, simply omit the class attribute and add a script tag:\n\n      <code>\n\n        <mapper name=\"scim\" type=\"groovy\">\n          <mapperScript>\n              <![CDATA[\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n              UserManager um = Framework.getLocalService(UserManager.class);\n\n              String userId = userObject.getId();\n              if (userId == null || userId.isEmpty()) {\n                userId = userObject.getUserName();\n              }\n\n              searchAttributes.put(um.getUserIdField(), userId);\n\n              if (searchAttributes.containsKey(\"uid\")) {\n                userAttributes.put(um.getUserIdField(), searchAttributes.get(\"uid\"));\n              }\n\n              if (userObject.getEmails() != null && userObject.getEmails().size() > 0) {\n                userAttributes.put(\"email\",userObject.getEmails().iterator().next().getValue());\n              }\n              String displayName = userObject.getDisplayName();\n              if (displayName!=null && !displayName.isEmpty()) {\n                int idx = displayName.indexOf(\" \");\n                if (idx>0) {\n                    userAttributes.put(\"firstName\", displayName.substring(0, idx).trim());\n                    userAttributes.put(\"lastName\", displayName.substring(idx+1).trim());\n                } else {\n                    userAttributes.put(\"firstName\", displayName);\n                    userAttributes.put(\"lastName\", \"\");\n                }\n            }\n            ]]>\n              </mapperScript>\n\n        <wrapperScript>\n              <![CDATA[\n          import org.nuxeo.ecm.core.api.DocumentModel;\n          import org.nuxeo.ecm.core.api.NuxeoException;\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n          import com.unboundid.scim.data.Entry;\n          import com.unboundid.scim.data.GroupResource;\n          import com.unboundid.scim.data.Meta;\n          import com.unboundid.scim.data.Name;\n          import com.unboundid.scim.data.UserResource;\n          import com.unboundid.scim.schema.CoreSchema;\n          import com.unboundid.scim.sdk.SCIMConstants;\n\n              UserManager um = Framework.getLocalService(UserManager.class);\n              DocumentModel userModel = nuxeoPrincipal.getModel();\n              String userId = (String) userModel.getProperty(um.getUserSchemaName(),\n                      um.getUserIdField());\n\n              String fname = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"firstName\");\n              String lname = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"lastName\");\n              String email = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"email\");\n              String company = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"company\");\n\n              String displayName = fname + \" \" + lname;\n              displayName = displayName.trim();\n              userObject.setDisplayName(displayName);\n              Collection<Entry<String>> emails = new ArrayList<>();\n              if (email!=null) {\n                  emails.add(new Entry<String>(email, \"string\"));\n                  userObject.setEmails(emails);\n              }\n\n              Name fullName = new Name(displayName, lname, \"\", fname, \"\", \"\");\n              userObject.setSingularAttributeValue(SCIMConstants.SCHEMA_URI_CORE,\n                      \"name\", Name.NAME_RESOLVER, fullName);\n\n              // manage groups\n              List<String> groupIds = um.getPrincipal(userId).getAllGroups();\n              Collection<Entry<String>> groups = new ArrayList<>();\n              for (String groupId : groupIds) {\n                  groups.add(new Entry<String>(groupId, \"string\"));\n              }\n              userObject.setGroups(groups);\n\n              userObject.setActive(true);\n            ]]>\n        </wrapperScript>\n    </mapper>\n\n\n    <mapper name=\"jsDummy\" type=\"js\">\n          <mapperScript>\n              searchAttributes.put(\"username\", userObject.login);\n              userAttributes.put(\"firstName\", userObject.name.firstName);\n              userAttributes.put(\"lastName\", userObject.name.lastName);\n              profileAttributes.put(\"userprofile:phonenumber\", \"555.666.7777\");\n          </mapperScript>\n      </mapper>\n\n    </code>\n\n      In the script context for mapping userObject to NuxeoPrincipal :\n      <ul>\n        <li>\n          userObject : represent the object passed to the\n          <pre>getCreateOrUpdateNuxeoPrincipal</pre>\n          method\n        </li>\n        <li> searchAttributes : is the Map&lt;String,String&gt; that will be used\n          to search the NuxeoPrincipal</li>\n        <li> userAttributes : is the Map&lt;String,String&gt; that will be used\n          to create/update the NuxeoPrincipal</li>\n        <li> profileAttribute : is the Map&lt;String,String&gt; that will be used\n          to update the user's profile</li>\n\n      </ul>\n\n\n      In the script context for wrapping a NuxeoPrincipal into a userObject :\n      <ul>\n        <li>\n          userObject : represent the userObject as initialized by the caller code\n        </li>\n        <li> nuxeoPrincipal : is the principal to wrap</li>\n        <li> params : is the Map&lt;String,Serializable&gt; passed by the caller</li>\n      </ul>\n\n    </documentation>\n\n    <object class=\"org.nuxeo.usermapper.service.UserMapperDescriptor\" />\n  </extension-point>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/usermapper-service.xml",
          "xmlPureComponent": false
        }
      ],
      "fileName": "nuxeo-usermapper-7.10.jar",
      "groupId": "org.nuxeo.ecm.platform",
      "hierarchyPath": "/grp:org.nuxeo.ecm.platform/org.nuxeo.usermapper",
      "id": "org.nuxeo.usermapper",
      "location": "",
      "manifest": "Manifest-Version: 1.0\r\nArchiver-Version: Plexus Archiver\r\nCreated-By: Apache Maven\r\nBuilt-By: hudson\r\nBuild-Jdk: 1.8.0_60\r\nBundle-ManifestVersion: 2\r\nBundle-Version: 7.10-t20151110-184303\r\nBundle-Vendor: Nuxeo\r\nBundle-ActivationPolicy: lazy\r\nBundle-ClassPath: .\r\nBundle-Name: org.nuxeo.usermapper\r\nNuxeo-Component: OSGI-INF/usermapper-service.xml\r\nBundle-SymbolicName: org.nuxeo.usermapper\r\n\r\n",
      "packages": [],
      "requirements": [],
      "version": "7.10"
    }
  ],
  "creationDate": 1664792867649,
  "key": "Nuxeo Platform LTS 2015-7.10",
  "name": "Nuxeo Platform LTS 2015",
  "operations": [],
  "packages": [],
  "pluginSnapshots": {},
  "releaseDate": 1447023600000,
  "version": "7.10"
}